package ventas;





import org.joda.time.DateTime;

import sucursal.Sucursal;
import clientes.Cliente;
import clientes.ListaDeCompras;
import clientes.Ticket;
import envios.EnvioPagado;
import exceptions.VentaYaAbonadaException;
import exceptions.VentasException;

/**
 * @author Lucas Alan Silvestri.
 *
 */
public class VentaConEnvioYaPagado extends VentaConEnvio {
	
	/**
	 * 
	 * @param productosQueDeseaComprar son los productos que desea
	 * comprar el cliente de esta venta.
	 * @param sucursalDondeSeRealizaLaVenta es la sucursal en donde
	 * se esta realizando esta venta.
	 * @param clienteQueDeseaRealizarLaCompra es el cliente que desea
	 * realizar esta compra.
	 */
	public VentaConEnvioYaPagado(ListaDeCompras unaListaDeCompras,
			Sucursal sucursalDondeSeRealizaLaVenta,
			Cliente clienteQueDeseaRealizarLaCompra) {
		super(unaListaDeCompras, sucursalDondeSeRealizaLaVenta,
				clienteQueDeseaRealizarLaCompra);
		this.setEnvioAProcesar(new EnvioPagado(this));
	}
	
	/**
	 * comenzara el proceso de compra, es decir que se
	 * cobrara todos los productos que desee comprar el usuario
	 * y si los puede pagar, estos seran despachados a productos
	 * comprados.
	 */
	@Override
	public void realizarCompra() throws VentasException{
		this.setTicketDeVenta(new Ticket(
				this.montoAPagarPorLosProductos(), DateTime.now(),
				this.getListaDeCompraDelCliente()));
		this.getProductosComprados().putAll(
				this.getProductosQueDeseaComprar());
		this.tacharProductosComprados();
	}

	/**
	 * @return si el cliente puede pagar los productos.
	 * @throws VentaYaAbonadaException 
	 */
	@Override
	protected boolean elClientePuedePagarLosProductos() throws VentaYaAbonadaException{
		throw new VentaYaAbonadaException();
	}

	/**
	 * cobrara los productos al cliente.
	 * @throws VentaYaAbonadaException 
	 */
	@Override
	protected void cobrarProductos() throws VentaYaAbonadaException{
		throw new VentaYaAbonadaException();
	}

	/**
	 * Retorna los productos que estaban siendo por ser
	 * comprados a la sucursal donde se realiza la compra.
	 */
	@Override
	public void devolverProductos() {
		this.getSucursalDondeSeRealizaLaVenta().agregarStockAlStockDeSucursal(
				this.transformarAStock(
						this.getProductosComprados()));
		
	}
	
	/**
	 * @return el monto a pagar por los productos.
	 * @throws VentaYaAbonadaException 
	 */
	@Override
	protected float montoAPagarPorLosProductos(){
		return 0F;
	}
	
	/**
	 * @return el monto que el cliente 
	 * debera pagar con los descuentos aplicados.
	 * @throws VentaYaAbonadaException 
	 */
	protected float montoAPagarConDescuentosAplicados() {
		return 0F;
	}
}